// 接口，定义了接口之后，除非接口里面有可选属性，否则在使用的时候一定要和接口定义的属性数量并且类型要一致
interface oneinterface {
    color: string,
    // 定义可选属性--好处之一是可以对可能存在的属性进行预定义，好处之二是可以捕获引用了不存在的属性时的错误
    age?: number
}
function fun1(parm: oneinterface): void {

}

fun1({ color: "wwj", age: 233 })


// 只读属性
interface readeronly2 {
    readonly x: string,
    readonly y: number
}
let poin: readeronly2 = { x: "wwj", y: 32 }
console.log('poin;', poin);
// poin.x= "fwejfo" // Cannot assign to 'x' because it is a read-only property.
// 只读属性:ReadonlyArray
// TypeScript具有ReadonlyArray<T>类型，它与Array<T>相似，只是把所有可变方法去掉了，因此可以确保数组创建后再也不能被修改：
let a: number[] = [1, 2, 3, 4];
let ro: ReadonlyArray<number> = a;
// ro[0] = 12; // error!
// ro.push(5); // error!
// ro.length = 100; // error!
// a = ro; // error!


// 额外的属性检查
interface SquareConfig {
    color?: string;
    width?: number;
    [propName: string]: any;
}
function createSquare(config: SquareConfig) {
    // ...
}
// 跳过属性不在目标对象中的检查
// 1、使用断言
let mySquare = createSquare({ width: 100, opacity: 0.5 } as SquareConfig);
// 2、额外属性，就是上面的定义接口的方式， [propName: string]: any;
// 3、将这个对象赋值给一个另一个变量
let squareOptions = { colour: "red", width: 100 };
mySquare = createSquare(squareOptions);





// 函数类型
interface funcInter {
    (index: number, ele: string): number
}
let myFuncInter: funcInter;
myFuncInter = function (index, ele) {
    return 2;
}



